package br.requisiteworks.modelo.service;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.requisiteworks.modelo.Time;
import br.requisiteworks.modelo.dao.TimeDao;
import br.requisiteworks.util.persistencia.ErroBancoDados;
import br.requisiteworks.util.persistencia.ResultadoVazio;

/**
 * Servico responsavel por executar as operacoes principais do modulo de
 * {@link Time}s
 * 
 * @author Leandro Chaves
 * @version 1, 31/05/2010
 */
@Service
public class TimeService {

    /**
     * Log da classe
     */
    private static final Log log = LogFactory.getLog(TimeService.class);

    @Autowired
    private TimeDao timeDao;

    /**
     * Salva um novo {@link Time} ao repositorio de dados
     * 
     * @param time
     *            o {@link Time} a ser adicionado ao repositorio
     * @throws ErroBancoDados
     *             Caso ocorra algum erro durante a persistencia do {@link Time}
     */
    public void salvarTime(Time time) throws ErroBancoDados {
	this.timeDao.insert(time);
	log.info("Time adicionado com sucesso: " + time);
    }

    /**
     * Atualiza um {@link Time} existente no repositorio de dados
     * 
     * @param time
     *            o {@link Time} a ser atualizado
     * @throws ErroBancoDados
     *             Caso ocorra algum erro durante a persistencia do {@link Time}
     */
    public void atualizarTime(Time time) throws ErroBancoDados {
	this.timeDao.update(time);
	log.info("Time atualizado com sucesso: " + time);
    }

    /**
     * Busca no repositorio por todos os {@link Time}s cadastrados no sistema
     * 
     * @throws ResultadoVazio
     *             Caso nanum {@link Time} seja encontrado
     */
    public List<Time> listarTimes() throws ResultadoVazio {
	return this.timeDao.select();
    }

    /**
     * Busca no repositorio um {@link Time} cujo numero seja igual ao parametro
     * passado
     * 
     * @param numero
     *            O numero de identificacao do {@link Time} no repositorio de
     *            dados
     * @throws ResultadoVazio
     *             Caso um {@link Time} nao seja encontrado
     */
    public Time carregarTime(int numero) throws ResultadoVazio {
	return this.timeDao.select(numero);
    }

    /**
     * Remove do repositorio o {@link Time} passado pelo parametro
     * 
     * @param time
     *            O {@link Time} que sera removido do repositorio de dados
     * @throws ErroBancoDados
     *             Caso ocorra algum erro durante a transacao
     */
    public void deletaTime(Time time) throws ErroBancoDados {
	this.timeDao.delete(time);
	log.info("Time apagado com sucesso: " + time);
    }

    public List<Time> procuraNome(String nome) throws ResultadoVazio {
	return this.timeDao.select(nome);
    }
}
